package com.gitee.qdbp.base.controlling;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.gitee.qdbp.able.jdbc.paging.PartList;
import com.gitee.qdbp.base.annotation.DataIsolation;
import com.gitee.qdbp.base.annotation.OperateTraces;
import com.gitee.qdbp.base.enums.OperateType;

/**
 * 操作记录明细实体类
 *
 * @author zhh
 * @version 170522
 */
@OperateTraces(enable = false)
@DataIsolation(enable = false)
public class OperateTracesBean implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 表名 **/
    public static final String TABLE = "sys_operate_traces";

    /** ID **/
    private String id;

    /** 主表ID **/
    private String recordId;

    /** 租户编号 **/
    private String tenantCode;

    /** 操作类型(0.查询|1.新增|2.更新|3.删除|4.其他) **/
    private OperateType operateType;

    /** 数据类型 **/
    private String dataType;

    /** 数据ID **/
    private String dataId;

    /** 数据编号 **/
    private String dataCode;

    /** 数据值 **/
    private String dataValue;

    /** 数据描述 **/
    private String dataDesc;

    /** 执行描述 **/
    private String executeDesc;

    /** 执行方法 **/
    private String executeMethod;

    /** 执行时间 **/
    private Integer executeTime;

    /** 受影响行数 **/
    private Integer affectedRows;

    /** 创建时间 **/
    private Date createTime;

    /** 获取ID **/
    public String getId() {
        return id;
    }

    /** 设置ID **/
    public void setId(String id) {
        this.id = id;
    }

    /** 获取主表ID **/
    public String getRecordId() {
        return recordId;
    }

    /** 设置主表ID **/
    public void setRecordId(String recordId) {
        this.recordId = recordId;
    }

    /** 获取租户编号 **/
    public String getTenantCode() {
        return tenantCode;
    }

    /** 设置租户编号 **/
    public void setTenantCode(String tenantCode) {
        this.tenantCode = tenantCode;
    }

    /** 获取操作类型(0.查询|1.新增|2.更新|3.删除|4.其他) **/
    public OperateType getOperateType() {
        return operateType;
    }

    /** 设置操作类型(0.查询|1.新增|2.更新|3.删除|4.其他) **/
    public void setOperateType(OperateType operateType) {
        this.operateType = operateType;
    }

    /** 获取数据类型 **/
    public String getDataType() {
        return dataType;
    }

    /** 设置数据类型 **/
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    /** 获取数据ID **/
    public String getDataId() {
        return dataId;
    }

    /** 设置数据ID **/
    public void setDataId(String dataId) {
        this.dataId = dataId;
    }

    /** 获取数据编号 **/
    public String getDataCode() {
        return dataCode;
    }

    /** 设置数据编号 **/
    public void setDataCode(String dataCode) {
        this.dataCode = dataCode;
    }

    /** 获取数据值 **/
    public String getDataValue() {
        return dataValue;
    }

    /** 设置数据值 **/
    public void setDataValue(String dataValue) {
        this.dataValue = dataValue;
    }

    /** 获取数据描述 **/
    public String getDataDesc() {
        return dataDesc;
    }

    /** 设置数据描述 **/
    public void setDataDesc(String dataDesc) {
        this.dataDesc = dataDesc;
    }

    /** 获取执行描述 **/
    public String getExecuteDesc() {
        return executeDesc;
    }

    /** 设置执行描述 **/
    public void setExecuteDesc(String executeDesc) {
        this.executeDesc = executeDesc;
    }

    /** 获取执行方法 **/
    public String getExecuteMethod() {
        return executeMethod;
    }

    /** 设置执行方法 **/
    public void setExecuteMethod(String executeMethod) {
        this.executeMethod = executeMethod;
    }

    /** 获取执行时间 **/
    public Integer getExecuteTime() {
        return executeTime;
    }

    /** 设置执行时间 **/
    public void setExecuteTime(Integer executeTime) {
        this.executeTime = executeTime;
    }

    /** 获取受影响行数 **/
    public Integer getAffectedRows() {
        return affectedRows;
    }

    /** 设置受影响行数 **/
    public void setAffectedRows(Integer affectedRows) {
        this.affectedRows = affectedRows;
    }

    /** 获取创建时间 **/
    public Date getCreateTime() {
        return createTime;
    }

    /** 设置创建时间 **/
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends OperateTracesBean> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setId(this.getId()); // 主键
        instance.setRecordId(this.getRecordId()); // 主表ID
        instance.setTenantCode(this.getTenantCode()); // 租户编号
        instance.setOperateType(this.getOperateType()); // 操作类型(0.查询|1.新增|2.更新|3.删除)
        instance.setDataType(this.getDataType()); // 数据类型
        instance.setDataId(this.getDataId()); // 数据ID
        instance.setDataCode(this.getDataCode()); // 数据编号
        instance.setDataValue(this.getDataValue()); // 数据值
        instance.setDataDesc(this.getDataDesc()); // 数据描述
        instance.setExecuteDesc(this.getExecuteDesc()); // 执行描述
        instance.setExecuteMethod(this.getExecuteMethod()); // 执行方法
        instance.setExecuteTime(this.getExecuteTime()); // 执行时间
        instance.setAffectedRows(this.getAffectedRows()); // 受影响行数
        instance.setCreateTime(this.getCreateTime()); // 创建时间
        return instance;
    }

    /**
     * 将OperateTracesBean转换为子类对象
     *
     * @param beans 待转换的对象列表
     * @param clazz 目标类型
     * @param <T> OperateTracesBean或子类
     * @param <C> T的子类
     * @return 目标对象列表
     */
    public static <T extends OperateTracesBean, C extends T> List<C> to(List<T> beans, Class<C> clazz) {
        if (beans == null) {
            return null;
        }
        List<C> list;
        if (beans instanceof PartList) {
            PartList<C> partlist = new PartList<>();
            partlist.setTotal(((PartList<?>) beans).getTotal());
            list = partlist;
        } else {
            list = new ArrayList<>();
        }
        for (OperateTracesBean bean : beans) {
            list.add(bean.to(clazz));
        }
        return list;
    }

}